package controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.commons.codec.digest.DigestUtils;

import util.Converter;
import model.Gruppi;
import model.Utente;
import dto.UtenteDTO;

/**
 * Session Bean implementation class UtenteBean
 */
@Stateless
public class UserMgrBean implements UserMgr {

	@PersistenceContext
    private EntityManager em;
	
	@Resource
	private EJBContext context;
	

	@Override
	public boolean save(UtenteDTO Utente) {
		if(em.find(Utente.class, Utente.getEmail())!=null){
		return false;
		}
		else{
		Utente newUser = new Utente(Utente,true);
		List<Gruppi> groups = new ArrayList<Gruppi>();
		groups.add(Gruppi.Pending);
		//groups.add(Gruppi.Utenti);
		newUser.setGruppi(groups);
		em.persist(newUser);
		return true;
		}
	}


	@Override
	@RolesAllowed({Gruppi._Utenti,Gruppi._Impiegati})
	public void update(UtenteDTO Utente) {
		em.merge(new Utente(Utente));
	}


	@Override
	@RolesAllowed({Gruppi._Utenti,Gruppi._Impiegati})
	public UtenteDTO getUtenteDTO() {
		UtenteDTO UtenteDTO = Converter.convertToDTO(getPrincipalUser());
		return UtenteDTO;
	}


	@Override
	@RolesAllowed({Gruppi._Utenti})
	public void unregister() {
		remove(getPrincipalUser());
	}


	public Utente find(String email) {
    	return em.find(Utente.class, email);
    }
    
    public List<Utente> getAllUsers() {
    	return em.createNamedQuery(Utente.FIND_ALL, Utente.class)
                .getResultList();
    }

    public void remove(String email) {
		Utente Utente = find(email);
        em.remove(Utente);
	}
    
    public void remove(Utente Utente) {
    	em.remove(Utente);
	}
    
    
    public Utente getPrincipalUser() {
    	return find(getPrincipalEmail());
    }
	
    
    public String getPrincipalEmail() {
    	return context.getCallerPrincipal().getName();
    }


	@Override
	public UtenteDTO getUtenteEmail(String email) {
		Utente u = find(email);
		if(u!=null && u.getGruppi().get(0)!=Gruppi.Impiegati)
			return Converter.convertToDTO(u);
		else 
			return null;
	}


	@Override
	public void valida(String email) {
		Utente u = find(email);
		if(u!=null){
		List<Gruppi> g = u.getGruppi();
		if(g.get(0)==Gruppi.Pending){
			g.remove(0);
			g.add(Gruppi.Utenti);
			u.setConfermato(true);
		}
		em.merge(u);
		}
	}
	
	@Override
	@RolesAllowed({Gruppi._Utenti,Gruppi._Impiegati,Gruppi._Pending})
	public boolean check(){
		if(this.getPrincipalUser().getGruppi().get(0)==Gruppi.Pending)
			return false;
		else return true;
	}


	@Override
	public String resetPassword(String email) {
		Utente u = find(email);
		if(u!=null){
		String newp = String.valueOf( (int)(Math.random()*100000000));
		u.setPassword(DigestUtils.sha256Hex(newp));
		em.merge(u);
		return newp;
		}
		return "";
	}


	@Override
	public int loggato() {
		try{
		Utente u = getPrincipalUser();
		if(u.getGruppi().get(0)==Gruppi.Utenti)
		return 1;
		else if(u.getGruppi().get(0)==Gruppi.Impiegati)
			return 2;
		else return 0;
			}
		catch(Exception e){
		return 0;
		}
	}


}
